package nextel.visita;

import com.nextel.gui.gauge.FrmGaugeProcesar;
import com.nextel.gui.gauge.Procesar;
import nextel.ruta.ControlRuta;
import nextel.ruta.bean.RutaBean;
import nextel.visita.bean.EstadoBean;
import nextel.visita.bean.FotoBean;
import nextel.visita.mvc.MVCFoto;
import nextel.visita.rms.RMSFoto;
import pe.com.nextel.main.ControlBase;
import javax.microedition.io.HttpConnection;
import nextel.Configuracion;
import nextel.PropertiesMovil;
import nextel.agps.ControlAgps;
import nextel.dao.HttpControl;
import nextel.dao.XMLDAO;
import nextel.usuario.ControlUsuario;
import nextel.visita.bean.TransaccionBean;
import nextel.visita.mvc.MVCEntrega;
import nextel.visita.mvc.MVCEstado;
import nextel.visita.mvc.MVCMotivo;
import nextel.visita.rms.RMSServicio;
import pe.com.nextel.util.Fecha;
import org.kxml2.io.KXmlParser;
import pe.com.nextel.http.HttpSimple;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.util.List;

/**
 *
 * @author eespinoza
 */
public class ControlVisita extends ControlBase implements Procesar {
    
    private static final ControlVisita control = new ControlVisita();
    //current
    public TransaccionBean currentServicio;
    public EstadoBean currentEstado;
    // rms
    public final RMSServicio rmsServicio = new RMSServicio();
    public final RMSFoto rmsFoto = new RMSFoto();
    //mvc
    public final MVCEstado mvcEstado = new MVCEstado();
    public final MVCMotivo mvcMotivo = new MVCMotivo();
    public final MVCEntrega mvcEntrega = new MVCEntrega();
    public final MVCFoto mvcFoto= new MVCFoto( );
    
    public Thread thread;
    public boolean flagIniciadoFoto = false;
    
    
    public void joinThread() {
        try {
            if (thread != null && thread.isAlive()) {
                thread.join();
            }
        } catch (Exception e) {
        }
    }
    
    /**
     * metodo de acceso para instanciar los recordStored
     */
    public static ControlVisita getInstance() {
        return control;
    }
    
    /**
     * para no crear mas instancias
     */
    private ControlVisita() {
    }
    FrmGaugeProcesar frmGaugeProcesar;
    
    public void enviarSincronizacion() {
        frmGaugeProcesar = new FrmGaugeProcesar();
        
        ControlUsuario.getInstance().setXmlListener(frmGaugeProcesar);
        frmGaugeProcesar.iniciar(this);
    }
    
    /*****************************************************************************/
    /********************LOGICA DE NEGOCIO **************************************/
    /*****************************************************************************/
    public void iniciarServicio(boolean noVisita) {
        try {
            
            limpiarMemoria();
            
            currentServicio = new TransaccionBean();
            currentServicio.usuario = ControlUsuario.getInstance().currentUsuario.codigo;
            
            currentServicio.fechaInicio = Fecha.getDate().getTime();
            
//            if (Configuracion.ACTIVO.equals(ControlUsuario.getInstance().currentUsuario.ruta)) {
                currentServicio.codigoActividad = ControlRuta.getInstance().currentRuta.codigoActividad;
                currentServicio.cantidadEstados = ControlRuta.getInstance().currentRuta.lstEstados.size();
                
                if(noVisita)
                    setCurrent(mvcMotivo);
                else
                    setCurrent(mvcEstado);
                
//            }else{
//                
//                //asignamos la ruta a la transaccion
//                RutaBean ruta = ControlUsuario.getInstance().rmsRuta.obtenerPrimeraRuta();
//
//                // System.out.println("ruta=" + ruta);
//
//
//                if(ruta != null && ruta.lstEstados.size() > 0 ){
//
//                    ruta.ultimoEstado = ControlUsuario.getInstance().currentUsuario.ultimoEstado;
//
//                    currentServicio.cantidadEstados = ruta.lstEstados.size();
//
//                    //System.out.println("ruta.ultimoEstado=" + ruta.ultimoEstado);
//
//                    currentEstado = ruta.getEstadoActualSiguiente();
//
//                    // System.out.println("currentEstado = " + currentEstado);
//
//                    if(currentEstado == null){
//                        currentEstado = ruta.getPrimerEstado();
//
//
//                    }
//
//                    setCurrent(mvcEstado);
//
//                    // System.out.println("currentEstado = " + currentEstado);
//
//
//
//                }else{
//
//                    showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NO_EXISTEN_DATOS), ControlUsuario.getInstance().mvcMenu.showScreen());
//
//                }
//
//            }
            
            
        } catch (Exception e) {
            e.printStackTrace();
            
            showError("Error : " + e, ControlUsuario.getInstance().mvcMenu.showScreen());
            
        }
    }
    
    /*********************************************************************************/
    /**********************  TRANSACCIONES  ***********************************************/
    /*********************************************************************************/
    public void grabarServicio() {
        //#debug
//        System.out.println("ControlVisita.grabarServicio");
        try {
            
            if(Configuracion.ACTIVO.equals(ControlUsuario.getInstance().currentUsuario.gps)){
                if (ControlAgps.getInstance().currentGPS != null) {
                    currentServicio.latitud = ControlAgps.getInstance().currentGPS.latitude;
                    currentServicio.longitud = ControlAgps.getInstance().currentGPS.longitude;
                    currentServicio.celda = ControlAgps.getInstance().currentGPS.isAsistUsada();
                    currentServicio.velocidad = ControlAgps.getInstance().currentGPS.velocidad;
                    currentServicio.exactitud = ControlAgps.getInstance().currentGPS.exactitudLatLon;
                }
            }
            ////REGISTRA PROPIEDADES DEL MOVIL
                 currentServicio.errorConexion = PropertiesMovil.errorConexionGPS;                 
                 currentServicio.errorPosicion = PropertiesMovil.errorPosicionGPS;
                 currentServicio.bateria = PropertiesMovil.bateria;
                 currentServicio.senal = PropertiesMovil.senal;
                 currentServicio.telefono = PropertiesMovil.numeroTelefonico;
                 currentServicio.ip = PropertiesMovil.ip;
                 currentServicio.modelo = PropertiesMovil.modelo;

            ////
            currentServicio.cantidadEstadoAtendidos = currentEstado.posicion;
            currentServicio.codigoEstado = currentEstado.codigo;
            currentServicio.fechaFin = Fecha.getDate().getTime();


            
//            System.out.println("estado Actual=" + currentEstado.codigo);
            
// actualiza el estado de la ruta
            //SI ES RUTA
//            if (Configuracion.ACTIVO.equals(ControlUsuario.getInstance().currentUsuario.ruta)) {
                
                if("".equals(currentServicio.codigoMotivoNoEntrega)){
                    ControlRuta.getInstance().currentRuta.ultimoEstado = currentEstado.codigo;
                    
                     //incrementamos el reporte
                    if(ControlRuta.getInstance().currentRuta.getEstadoActualSiguiente() == null){
                        ControlUsuario.getInstance().currentUsuario.cantidadVista++;
                    }
                    
                }else{
                    //si es un no entrega o no visita vuelve al primer estado
                    ControlRuta.getInstance().currentRuta.noVisita = 1;
                   // ControlRuta.getInstance().currentRuta.ultimoEstado = ControlRuta.getInstance().currentRuta.getUltimoEstado().codigo;
                     
                }
                
                //actualiza la ruta con el ultimo estado
               // System.out.println("currentRuta==" + ControlRuta.getInstance().currentRuta.nombre);
                ControlRuta.getInstance().rmsRuta.actualizarObjectLista(ControlRuta.getInstance().currentRuta);
                
                
                //ingresa
                ControlUsuario.getInstance().currentUsuario.idRecordRuta = ControlRuta.getInstance().currentRuta.getIdRecodset( );
                ControlUsuario.getInstance().currentUsuario.posicionRuta = ControlRuta.getInstance().currentRuta.getPosicionID( );
                  
                //actualiza los indices de la ruta al usuario
                ControlUsuario.getInstance().rmsUsuario.grabarUsuario(ControlUsuario.getInstance().currentUsuario);
                
//            }else{
//                //SI ES VISITA SIN RUTA
//                // cuando no hay rutas actualizamos en el usuario la ultima posicion
//                if("".equals(currentServicio.codigoMotivoNoEntrega)){
//                    ControlUsuario.getInstance().currentUsuario.ultimoEstado = currentEstado.codigo;
//
//                      //incrementamos el reporte
//                     RutaBean ruta = ControlUsuario.getInstance().rmsRuta.obtenerPrimeraRuta();
//                    if(ruta.getEstadoActualSiguiente() == null){
//                        ControlUsuario.getInstance().currentUsuario.cantidadVista++;
//                    }
//
//                }else{
//                    RutaBean ruta = ControlUsuario.getInstance().rmsRuta.obtenerPrimeraRuta();
//                    //si es un no entrega o no visita vuelve al primer estado
//                    ControlUsuario.getInstance().currentUsuario.ultimoEstado = ruta != null ? ruta.getUltimoEstado().codigo: ""; //ControlRuta.getInstance().currentRuta.getUltimoEstado().codigo;
//
//                }
//
//
//                ControlUsuario.getInstance().rmsUsuario.grabarUsuario(ControlUsuario.getInstance().currentUsuario);
//            }
            
            //graba la transaccion
            rmsServicio.grabarServicio(currentServicio);
            
            enviarServicio();
            
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, ControlRuta.getInstance().mvcRutaDetalle.showScreen());
        }
    }
    
    public void pendientes() {
        try {
            enviarServicio();
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, ControlUsuario.getInstance().mvcMenu.showScreen());
            
        }
    }
    
    public void enviarServicio() throws Exception {


        //en caso de enviar xml
        getMensajeHttp().setMensaje(XMLDAO.getInstance().writeXMLServicio(currentServicio).getBytes());
        getMensajeHttp().setTipoEnvio(HttpConnection.POST);
        getMensajeHttp().setUrl(Configuracion.URL_ENVIO_SERVICIO);

        
        
        System.out.println("url =" + Configuracion.URL_ENVIO_SERVICIO);
        System.out.println("data =" + new String(getMensajeHttp().getMensaje()));
        
        
        HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_SERVICIO);
        
        iniciarConexionHTTP();
        
        
    }
    
    public void actualizarServicio(KXmlParser in) {
        // solo se debe eliminar el current servicio
        try {
            
            XMLDAO.getInstance().parseXMLServicio(in);
            
            // eliminar solo este servicio
            // System.out.println("currentServicio getID " + currentServicio.getIdRecodset());
            rmsServicio.deleteObjectIDRecordSet(currentServicio.getIdRecodset());
            
            limpiarMemoria();
            
            ControlRuta.getInstance().limpiarMemoria();
            
           
         //   System.out.println("mostrando el menu");
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_REGISTRO_ACTUALIZADO), ControlUsuario.getInstance().mvcMenu.showScreen());
         //   System.out.println("fin de mostrando el menu");
             if(Configuracion.ACTIVO.equals(ControlUsuario.getInstance().currentUsuario.foto)){
         //       System.out.println("inicio de foto");
                enviarFoto();
         //       System.out.println("fin de inicio de foto");
            }
        } catch (Exception e) {
            e.printStackTrace();
            
            showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NO_ATENDER_SERVICIO)+" :" + e, ControlUsuario.getInstance().mvcMenu.showScreen());
            
        }
    }
    
    public void limpiarMemoria() {
        currentServicio = null;
        System.gc();
    }
    
    public void eliminarDatos() throws Exception {
        rmsServicio.deleteAll();
        rmsFoto.deleteAll();
    }
    
//Se agrego
    public List getTransaccionPendientes() {
        try {
            return rmsServicio.getAllBean();
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error" + e, ControlUsuario.getInstance().mvcMenu.showScreen());
        }
        return null;
    }
    
    public void realizarProceso() {
        try {
            HttpSimple httpSimple = new HttpSimple();
            enviarServicioTotal(false);
            
            //envia el pedido
            httpSimple.mensajeHttp = getMensajeHttp();
            httpSimple.makeConnection(frmGaugeProcesar, HttpControl.getInstance());
            
            //sincroniza;
            ControlUsuario.getInstance().sincronizar();
            httpSimple.mensajeHttp = getMensajeHttp();
            httpSimple.makeConnection(frmGaugeProcesar, HttpControl.getInstance());
            
        } catch (Exception ex) {
            showError("Error: " + ex.getMessage(), ControlUsuario.getInstance().mvcMenu.showScreen());
        }
    }
    
    public void enviarServicioTotal(boolean flag) throws Exception {
        
        getMensajeHttp().setTipoEnvio(HttpConnection.POST);
        getMensajeHttp().setUrl(Configuracion.URL_ENVIO_SERVICIO);
        getMensajeHttp().setMensaje(XMLDAO.getInstance().writeXMLServicio(rmsServicio.getAllBean()).getBytes());
        
        System.out.println("url =" + Configuracion.URL_ENVIO_SERVICIO);
        System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));
        
        HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_SERVICIOSYNCRONIZAR);
        
        // conectar al servidor
        if (flag) {
            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_SERVICIOTOTAL);
            iniciarConexionHTTP();
        }
    }
    
    public void procesarRespuestaServicioTotalSyncronizar(KXmlParser parser) throws Exception {
        
        XMLDAO.getInstance().parseMensaje(parser);
        limpiarMemoria();
    }
    
    public void procesarRespuestaServicioTotal(KXmlParser parser) {
        
        try {
            
            XMLDAO.getInstance().parseMensaje(parser);
            
            rmsServicio.deleteAll();
            
            limpiarMemoria();
            
            
            if(Configuracion.ACTIVO.equals(ControlUsuario.getInstance().currentUsuario.foto)){
                //System.out.println("//enviando fotos");
                enviarFoto();
            }
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ENVIO_REGISTRADO), ControlUsuario.getInstance().mvcMenu.showScreen());
            
        } catch (Exception e) {
            showError("Error: " + e.getMessage(), ControlUsuario.getInstance().mvcMenu.showScreen());
        }
    }
    
    /****************************
     * FOTOS
     *****************************/
    public void grabarFoto(FotoBean foto) {
//        System.out.println("Midlet.grabarFoto");
        try {

            // Grabamos la foto
            foto.idUsuario = ControlUsuario.getInstance().currentUsuario.codigo;
            foto.codigoActividad = currentServicio.codigoActividad;
            foto.fecha = currentServicio.getFechaInicio();
 
            rmsFoto.grabarFoto(foto);
 
        } catch (Exception e) {
            try {
                showError("Error : " + e, mvcEstado.showScreen());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    
    public void enviarFoto( ) {
        
    //    System.out.println("Midlet.enviarFoto");
        try {
            
            if(!flagIniciadoFoto){
                joinThread();
                thread = null;
                thread = new Thread() {
                    
                    public void run() {
                        try {
                            flagIniciadoFoto = true;
                            rmsFoto.procesarFotos();
                            flagIniciadoFoto = false;
                        } catch (Exception e) {
                            e.printStackTrace();
                            // showError("Error al enviar foto, reintente");
                        }
                    }
                };
                
                //System.out.println("Midlet.No start ");
                thread.start();
                //System.out.println("Midlet.Start");
            }
            
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
}
